﻿namespace _5_NovaAdmin.Infrastructure.Extensions;

public static class MediatorExtension
{
    /// <summary>
    /// 分发领域事件
    /// </summary>
    /// <param name="mediator">事件分发器</param>
    /// <param name="ctx">数据库上下文</param>
    /// <example>
    /// await mediator.DispatchDomainEventsAsync(context);
    /// </example>
    public static async Task DispatchDomainEventsAsync(this IMediator mediator, DbContext ctx)
    {
        // 从数据库上下文的变更跟踪器中获取所有实体并且过滤出那些包含领域事件的实体
        var domainEntities = ctx.ChangeTracker
            .Entries<Entity>() // 获取所有实体的变更跟踪条目
            .Where(x => x.Entity.DomainEvents != null && x.Entity.DomainEvents.Any()); // 过滤出包含领域事件的实体

        // 从包含领域事件的实体中提取所有领域事件
        var domainEvents = domainEntities
            .SelectMany(x => x.Entity.DomainEvents)
            .ToList();

        // 清空实体中的领域事件，以便后续操作不会重复处理这些事件
        domainEntities.ToList()
            .ForEach(entity => entity.Entity.ClearDomainEvents());

        // 通过事件分发器异步发布所有领域事件
        foreach (var domainEvent in domainEvents)
            await mediator.Publish(domainEvent);
    }
}